package cn.rtplay.esp32camcar.downloadFile;

import java.io.File;
import java.io.InputStream;
import java.util.Objects;
import java.util.concurrent.Callable;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * 作者:王浩 邮件:bingoogolapple@gmail.com
 * 创建时间:16/12/16 上午10:48
 * 描述:应用升级工具类
 */
public class RTBUpgradeUtil {
    private RTBUpgradeUtil() {
    }

    /**
     * 监听下载进度
     *
     * @return Observable
     */
    public static Observable<RTBDownloadProgressEvent> getDownloadProgressEventObservable() {
        return RxUtil.getDownloadEventObservable();
    }

    /**
     * apk 文件是否已经下载过，如果已经下载过就直接安装
     *
     * @param version 新 apk 文件版本号
     * @return true:存在 false:不存在
     */
    public static boolean isFileDownloaded(String version) {
        File file = StorageUtil.getFile(version);
        return file.exists();
    }

    /**
     * 下载新版 apk 文件
     *
     * @param url     apk 文件路径
     * @param version 新 apk 文件版本号
     * @return Observable
     */
    public static Observable<File> downloadFile(final String url, final String version) {
        return Observable.defer((Callable<Observable<InputStream>>) () -> {
            try {
                return Observable.just(Objects.requireNonNull(Engine.getInstance().getDownloadApi().downloadFile(url).execute().body()).byteStream());
            } catch (Exception e) {
                return Observable.error(e);
            }
        }).map(inputStream -> StorageUtil.saveFile(inputStream, version))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

    /**
     * 删除之前升级时下载的老的 apk 文件
     */
    public static void deleteOldFile() {
        File fileDir = StorageUtil.getFileDir();
        if (fileDir == null || fileDir.listFiles() == null || Objects.requireNonNull(fileDir.listFiles()).length == 0) {
            return;
        }

        // 删除文件
        StorageUtil.deleteFile(fileDir);
    }

    /**
     * 设置现在文件目录和文件类型
     */
    public static void setDownloadPara(String fileType, String dirName) {
        StorageUtil.setFileType(fileType);
        StorageUtil.setDirName(dirName);
    }

    /**
     * 重新设置下载文件类型
     */
    public static void setDownloadFileType(String newType, String version) {
        StorageUtil.renameFileType(newType, version);
    }
}
